<?php
/**
 * Created by PhpStorm.
 * User: ZhangZhi
 * Date: 2019-07-13 15:48
 */

namespace App\Helper;

class ExpressFeeHelper
{
    // 北京
    const FROM_BEIJING = [
        [
            'city' => ['北京', '北京市'], // 北京分郊区（首重15、续重3）和市区（首重13、续重2）
            'fee' => 15,
            'continue' => 3,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['北京市', '北京'],
            'other' => [
                [
                    'city' => ['东城区', '西城区', '朝阳区', '海淀区', '丰台区'],
                    'fee' => 13,
                    'continue' => 2
                ]
            ]
        ],
        [
            'city' => ['河北省'],
            'fee' => 14,
            'continue' => 2
        ],
        [
            'city' => ['天津', '天津市'],
            'fee' => 15,
            'continue' => 3
        ],
        [
            'city' => ['山东省', '辽宁省', '山西省', '河南省'],
            'fee' => 22,
            'continue' => 8
        ],
        [
            'city' => ['上海', '上海市', '江苏省', '浙江省', '湖北省', '陕西省', '黑龙江省', '吉林省', '安徽省', '福建省', '江西省', '湖南省', '甘肃省', '宁夏回族自治区', '内蒙古自治区'],
            'fee' => 23,
            'continue' => 10
        ],
        [
            'city' => ['四川省', '重庆市', '重庆', '贵州省', '青海省'],
            'fee' => 23,
            'continue' => 13
        ],
        [
            'city' => ['广东省', '云南省', '广西壮族自治区', '海南省'],
            'fee' => 23,
            'continue' => 14
        ],
        [
            'city' => ['新疆维吾尔自治区', '西藏自治区'],
            'fee' => 26,
            'continue' => 21
        ],
    ];

    // 天津 PS：天津和北京价格一样
    const FROM_TIANJIN = [
        [
            'city' => ['北京', '北京市'], // 北京分郊区（首重15、续重3）和市区（首重13、续重2）
            'fee' => 15,
            'continue' => 3,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['北京市', '北京'],
            'other' => [
                [
                    'city' => ['东城区', '西城区', '朝阳区', '海淀区', '丰台区'],
                    'fee' => 13,
                    'continue' => 2
                ]
            ]
        ],
        [
            'city' => ['河北省'],
            'fee' => 14,
            'continue' => 2
        ],
        [
            'city' => ['天津', '天津市'],
            'fee' => 15,
            'continue' => 3
        ],
        [
            'city' => ['山东省', '辽宁省', '山西省', '河南省'],
            'fee' => 22,
            'continue' => 8
        ],
        [
            'city' => ['上海', '上海市', '江苏省', '浙江省', '湖北省', '陕西省', '黑龙江省', '吉林省', '安徽省', '福建省', '江西省', '湖南省', '甘肃省', '宁夏回族自治区', '内蒙古自治区'],
            'fee' => 23,
            'continue' => 10
        ],
        [
            'city' => ['四川省', '重庆市', '重庆', '贵州省', '青海省'],
            'fee' => 23,
            'continue' => 13
        ],
        [
            'city' => ['广东省', '云南省', '广西壮族自治区', '海南省'],
            'fee' => 23,
            'continue' => 14
        ],
        [
            'city' => ['新疆维吾尔自治区', '西藏自治区'],
            'fee' => 26,
            'continue' => 21
        ],
    ];

    // 上海
    const FROM_SHANGHAI = [
        [
            'city' => ['上海', '上海市', '江苏省', '浙江省'],
            'fee' => 12,
            'continue' => 2,
            'is_should_be_check_other' => [],
        ],
        [
            'city' => ['安徽省'],
            'fee' => 14,
            'continue' => 2
        ],
        [
            'city' => ['河南省', '湖北省', '江西省'],
            'fee' => 22,
            'continue' => 8
        ],
        [
            'city' => ['福建省', '山东省'],
            'fee' => 22,
            'continue' => 10
        ],
        [
            'city' => ['北京', '北京市', '天津', '天津市', '河北省', '湖南省', '陕西省', '山西省'],
            'fee' => 23,
            'continue' => 10
        ],
        [
            'city' => ['重庆', '重庆市', '甘肃省','广东省','广西壮族自治区','贵州省','辽宁省', '内蒙古自治区', '宁夏回族自治区', '四川省'], // 内蒙古（呼伦贝尔市、兴安盟的续重价格为18）
            'fee' => 23,
            'continue' => 13,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['内蒙古自治区'],
            'other' => [
                [
                    'city' => [
                        '呼和浩特市', '巴彦淖尔市', '包头市',
                        '乌兰察布市', '乌海市', '赤峰市',
                        '锡林郭勒盟', '通辽市', '阿拉善盟',
                        '鄂尔多斯市'
                    ],
                    'fee' => 23,
                    'continue' => 13
                ],
                [
                    'city' => ['呼伦贝尔市', '兴安盟'],
                    'fee' => 23,
                    'continue' => 18
                ]
            ]
        ],
        [
            'city' => ['海南省', '青海省', '云南省'],
            'fee' => 23,
            'continue' => 14
        ],
        [
            'city' => ['黑龙江省', '吉林省'],
            'fee' => 23,
            'continue' => 18
        ],
        [
            'city' => ['新疆维吾尔自治区', '西藏自治区'],
            'fee' => 26,
            'continue' => 21
        ],
    ];

    // 武汉
    const FROM_WUHAN = [
        [
            'city' => ['湖北省'],
            'fee' => 16, // 同城，如果目的地匹配不到的，默认使用此价格
            'continue' => 6, // 同上
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['湖北省'],
            'other' => [
                [
                    'city' => ['武汉市'],
                    'fee' => 11,
                    'continue' => 1,
                ],
                [
                    'city' => [
                        '孝感市','襄阳市','黄冈市','十堰市','咸宁市','荆州市',
                        '随州市','宜昌市','荆门市','仙桃市','天门市','潜江市',
                        '鄂州市','黄石市','神农架林区'
                    ],
                    'fee' => 13,
                    'continue' => 2
                ],
                [
                    'city' => ['恩施土家族苗族自治州'],
                    'fee' => 16,
                    'continue' => 6
                ]
            ]
        ],
        [
            'city' => ['湖南省', '江西省'],
            'fee' => 18,
            'continue' => 8
        ],
        [
            'city' => ['上海', '上海市', '安徽省', '河南省', '江苏省', '浙江省'],
            'fee' => 22,
            'continue' => 8
        ],
        [
            'city' => ['北京', '北京市', '天津', '天津市', '重庆', '重庆市', '福建省', '贵州省', '河北省', '山东', '山西省', '陕西省', '四川省'],
            'fee' => 23,
            'continue' => 10
        ],
        [
            'city' => ['宁夏回族自治区', '广西壮族自治区', '广东省', '甘肃省'],
            'fee' => 23,
            'continue' => 12
        ],
        [
            'city' => ['海南省', '辽宁省', '内蒙古自治区'],// 内蒙古（呼伦贝尔市、兴安盟的续重价格为14）
            'fee' => 23,
            'continue' => 13,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['内蒙古自治区'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => [
                        '呼和浩特市', '巴彦淖尔市', '包头市',
                        '乌兰察布市', '乌海市', '赤峰市',
                        '锡林郭勒盟', '通辽市', '阿拉善盟',
                        '鄂尔多斯市'
                    ],
                    'fee' => 23,
                    'continue' => 13
                ],
                [
                    'city' => ['呼伦贝尔市', '兴安盟'],
                    'fee' => 23,
                    'continue' => 14
                ]
            ]
        ],
        [
            'city' => ['吉林省', '黑龙江省'],
            'fee' => 23,
            'continue' => 14
        ],
        [
            'city' => ['新疆维吾尔自治区', '西藏自治区'],
            'fee' => 26,
            'continue' => 21
        ],
    ];

    // 长春
    const FROM_CHANGCHUN = [
        [
            'city' => ['吉林省'],
            'fee' => 16,
            'continue' => 6,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['吉林省'],
            'other' => [
                [
                    'city' => ['长春市'],
                    'fee' => 12,
                    'continue' => 1,
                ],
                [
                    'city' => ['吉林市','松原市','四平市','辽源市','通化市','白山市','白城市'],
                    'fee' => 13,
                    'continue' => 2,
                ],
                [
                    'city' => ['延边朝鲜族自治州'],
                    'fee' => 16,
                    'continue' => 6,
                ],
            ]
        ],
        [
            'city' => ['黑龙江省', '辽宁省'],
            'fee' => 18,
            'continue' => 8
        ],
        [
            'city' => ['北京', '北京市', '天津', '天津市', '河北省', '山东省'],
            'fee' => 23,
            'continue' => 10
        ],
        [
            // 内蒙古（呼伦贝尔市、兴安盟，通辽市的单价20，续重价格为8）
            'city' => ['安徽省', '河南省', '内蒙古自治区', '山西省'],
            'fee' => 23,
            'continue' => 13,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['内蒙古自治区'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => [
                        '呼和浩特市', '巴彦淖尔市', '包头市',
                        '乌兰察布市', '乌海市', '赤峰市',
                        '锡林郭勒盟', '阿拉善盟',
                        '鄂尔多斯市'
                    ],
                    'fee' => 20,
                    'continue' => 8
                ],
                [
                    'city' => ['呼伦贝尔市', '兴安盟', '通辽市'],
                    'fee' => 23,
                    'continue' => 13

                ],
            ],
        ],
        [
            'city' => ['上海', '上海市', '重庆', '重庆市', '甘肃省', '湖北省', '湖南省', '江苏省', '江西省', '宁夏回族自治区', '青海省', '陕西省', '四川省', '浙江省'],
            'fee' => 23,
            'continue' => 14
        ],
        [
            'city' => ['贵州省'],
            'fee' => 23,
            'continue' => 16
        ],
        [
            'city' => ['福建省', '广东省', '广西壮族自治区', '海南省', '云南省'],
            'fee' => 23,
            'continue' => 18
        ],
        [
            'city' => ['新疆维吾尔自治区', '西藏自治区'],
            'fee' => 28,
            'continue' => 25
        ],
    ];

    // 郑州
    const FROM_ZHENGZHOU = [
        [
            'city' => ['河南省'],// 有多个价格
            'fee' => 16,
            'continue' => 6,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['河南省'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => ['郑州市'],
                    'fee' => 11,
                    'continue' => 1
                ],
                [
                    'city' => [
                        '新乡市','商丘市','安阳市','开封市','信阳市',
                        '濮阳市','洛阳市','周口市', '许昌市','平顶山市',
                        '驻马店市','漯河市','焦作市','三门峡市','鹤壁市',
                        '南阳市'
                    ],
                    'fee' => 12,
                    'continue' => 2
                ],
            ],
        ],
        [
            'city' => ['山西省'],
            'fee' => 18,
            'continue' => 8
        ],
        [
            'city' => ['北京', '北京市', '天津', '天津市', '上海', '上海市', '安徽省', '河北省', '湖北省', '江苏省', '山东', '陕西省', '浙江省'],
            'fee' => 22,
            'continue' => 8
        ],
        [
            // 内蒙古（呼伦贝尔市、兴安盟的续重价格为13）
            'city' => ['重庆', '重庆市', '福建省', '甘肃省', '湖南省', '江西省', '辽宁省', '内蒙古自治区', '宁夏回族自治区', '四川省'],
            'fee' => 23,
            'continue' => 10,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['内蒙古自治区'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => [
                        '呼和浩特市', '巴彦淖尔市', '包头市',
                        '乌兰察布市', '乌海市', '赤峰市',
                        '锡林郭勒盟', '阿拉善盟', '通辽市',
                        '鄂尔多斯市'
                    ],
                    'fee' => 23,
                    'continue' => 10
                ],
                [
                    'city' => ['呼伦贝尔市', '兴安盟'],
                    'fee' => 23,
                    'continue' => 13

                ],
            ],
        ],
        [
            'city' => ['广东省', '广西壮族自治区', '海南省', '黑龙江省', '吉林省', '青海省', '云南省'],
            'fee' => 23,
            'continue' => 13
        ],
        [
            'city' => ['新疆维吾尔自治区', '西藏自治区'],
            'fee' => 26,
            'continue' => 21
        ],
    ];

    // 临沂
    const FROM_LINYI = [
        [
            'city' => ['山东省'],
            'fee' => 12,
            'continue' => 2,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['山东省'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => ['临沂市'],
                    'fee' => 12,
                    'continue' => 2
                ],
                [
                    'city' => [
                        '烟台市','潍坊市','济南市','德州市','威海市',
                        '青岛市','聊城市','济宁市', '淄博市','滨州市',
                        '泰安市','枣庄市','菏泽市','日照市','东营市',
                        '莱芜市'
                    ],
                    'fee' => 13,
                    'continue' => 2
                ],
            ],
        ],
        [
            'city' => ['北京', '北京市', '天津', '天津市', '河北省', '河南省', '辽宁省'],
            'fee' => 22,
            'continue' => 8
        ],
        [
            'city' => ['上海', '上海市', '江苏省', '浙江省'],
            'fee' => 22,
            'continue' => 10,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['江苏省'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => ['宿迁市','连云港','淮安市','盐城市','徐州市'],
                    'fee' => 16,
                    'continue' => 6
                ],
                [
                    'city' => ['南通市','南京市','无锡市','扬州市','常州市','镇江市','苏州市','泰州市'],
                    'fee' => 22,
                    'continue' => 10
                ],
            ],

        ],
        [
            'city' => ['安徽省', '福建省', '湖北省', '湖南省', '江西省', '吉林省', '宁夏回族自治区', '陕西省'],
            'fee' => 23,
            'continue' => 10
        ],
        [
            'city' => ['重庆', '重庆市', '甘肃省', '黑龙江省', '内蒙古自治区', '四川省'],
            'fee' => 23,
            'continue' => 13,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['内蒙古自治区'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => [
                        '呼和浩特市', '巴彦淖尔市', '包头市',
                        '乌兰察布市', '乌海市', '赤峰市',
                        '锡林郭勒盟', '阿拉善盟', '通辽市',
                        '鄂尔多斯市'
                    ],
                    'fee' => 23,
                    'continue' => 10
                ],
                [
                    'city' => ['呼伦贝尔市', '兴安盟'],
                    'fee' => 23,
                    'continue' => 13

                ],
            ],
        ],
        [
            'city' => ['广东省', '广西壮族自治区', '贵州省', '海南省', '青海省', '云南省'],
            'fee' => 23,
            'continue' => 14
        ],
        [
            'city' => ['新疆维吾尔自治区', '西藏自治区'],
            'fee' => 26,
            'continue' => 21
        ],
    ];

    // 广州
    const FROM_GUANGZHOU = [
        [
            'city' => ['广东省'],
            'fee' => 13, // 同城，如果目的地匹配不到的，默认使用此价格
            'continue' => 2, // 同上
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['广东省'],
            'other' => [
                [
                    'city' => ['广州市'],
                    'fee' => 12,
                    'continue' => 2,
                ],
                [
                    'city' => [
                        '湛江市','云浮市','深圳市','阳江市','茂名市',
                        '珠海市','清远市','肇庆市', '汕头市','东莞市',
                        '惠州市','韶关市','中山市','梅州市','佛山市',
                        '潮州市','汕尾市','江门市','揭阳市','河源市'
                    ],
                    'fee' => 13,
                    'continue' => 2
                ]
            ]
        ],
        [
            'city' => ['福建省'],
            'fee' => 20,
            'continue' => 8
        ],
        [
            'city' => ['广西壮族自治区', '海南省', '湖南省', '江西省'],
            'fee' => 22,
            'continue' => 8,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['广西壮族自治区'],
            'other' => [
                [
                    'city' => ['梧州市', '贺州市'],
                    'fee' => 16,
                    'continue' => 6,
                ],
                [
                    'city' => [
                        '防城港市','钦州市','南宁市','崇左市','贵港市',
                        '玉林市','柳州市','来宾市','百色市','桂林市','河池市','北海市'
                    ],
                    'fee' => 22,
                    'continue' => 8
                ]
            ]
        ],
        [
            'city' => ['安徽省', '贵州省', '湖北省'],
            'fee' => 23,
            'continue' => 12
        ],
        [
            'city' => ['上海', '上海市', '重庆', '重庆市', '河南省', '江苏省', '四川省', '云南省', '浙江省'],
            'fee' => 23,
            'continue' => 13
        ],
        [
            'city' => ['北京', '北京市', '天津', '天津市', '河北省', '辽宁省', '山东省', '山西省', '陕西省'],
            'fee' => 23,
            'continue' => 14
        ],
        [
            'city' => ['甘肃省', '宁夏回族自治区', '青海省'],
            'fee' => 23,
            'continue' => 18
        ],
        [
            'city' => ['黑龙江省', '吉林省', '内蒙古自治区'],
            'fee' => 25,
            'continue' => 20,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['内蒙古自治区'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => [
                        '呼和浩特市', '巴彦淖尔市', '包头市',
                        '乌兰察布市', '乌海市', '赤峰市',
                        '锡林郭勒盟', '通辽市', '阿拉善盟',
                        '鄂尔多斯市'
                    ],
                    'fee' => 23,
                    'continue' => 18
                ],
                [
                    'city' => ['呼伦贝尔市', '兴安盟'],
                    'fee' => 25,
                    'continue' => 20
                ]
            ]
        ],
        [
            'city' => ['新疆维吾尔自治区', '西藏自治区'],
            'fee' => 28,
            'continue' => 25
        ],
    ];

    // 成都市、资阳市、眉山市
    const FROM_CHENGDU_ZIYANG_MEISHAN = [
        [
            'city' => ['四川省'],
            'fee' => 12,
            'continue' => 2,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['四川省'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => ['成都市', '资阳市', '眉山市'],
                    'fee' => 11,
                    'continue' => 1
                ],
                [
                    'city' => [
                        '宜宾市','绵阳市','广安市','广元市','达州市',
                        '遂宁市','自贡市','雅安市','内江市','巴中市',
                        '乐山市','泸州市','阿坝州','南充市','德阳市'
                    ],
                    'fee' => 13,
                    'continue' => 2
                ],
                [
                    'city' => ['西昌市','攀枝花市','甘孜州'],
                    'fee' => 16,
                    'continue' => 6
                ],
            ],
        ],
        [
            'city' => ['重庆市', '重庆'],
            'fee' => 14,
            'continue' => 2
        ],
        [
            'city' => ['贵州省', '陕西省'],
            'fee' => 22,
            'continue' => 8
        ],
        [
            'city' => ['安徽省', '甘肃省', '广西壮族自治区', '河南省', '湖北省', '湖南省', '江西省', '宁夏回族自治区', '山西省', '云南省'],
            'fee' => 23,
            'continue' => 10,
        ],
        [
            'city' => ['北京', '北京市', '上海', '上海市', '天津', '天津市', '福建省', '广东省', '海南省', '河北省', '江苏省', '辽宁省', '青海省', '山东省', '浙江省'],
            'fee' => 23,
            'continue' => 13
        ],

        [
            'city' => ['西藏自治区'],
            'fee' => 23,
            'continue' => 16
        ],
        [
            'city' => ['黑龙江省', '吉林省', '内蒙古自治区', '新疆维吾尔自治区'],
            'fee' => 23,
            'continue' => 18,
            // 是否需要在other中获取对应的价格
            'is_should_be_check_other' => ['内蒙古自治区'],
            // other 用来处理特殊省份中存在不同地区，价格不同的情况
            'other' => [
                [
                    'city' => [
                        '呼和浩特市', '巴彦淖尔市', '包头市',
                        '乌兰察布市', '乌海市', '赤峰市',
                        '锡林郭勒盟', '阿拉善盟', '通辽市',
                        '鄂尔多斯市'
                    ],
                    'fee' => 23,
                    'continue' => 13
                ],
                [
                    'city' => ['呼伦贝尔市', '兴安盟'],
                    'fee' => 23,
                    'continue' => 18

                ],
            ],
        ]
    ];

    const INIT_FROM_CITIES = [
        '北京', '北京市', '上海', '上海市',
        '郑州', '郑州市', '武汉', '武汉市',
        '临沂', '临沂市', '长春', '长春市',
        '成都', '成都市', '资阳', '资阳市',
        '眉山', '眉山市', '广州', '广州市',
        '天津', '天津市'
    ];

    // 初始快递费用数据
    private $initData = self::FROM_BEIJING;
    // 重量
    private $weight   = 1;
    // 始发地
    private $from     = '北京';
    // 目的地省
    private $province = '北京';
    // 目的地市
    private $city     = '北京市';

    /**
     * ExpressFeeHelper constructor.
     * @param $from
     * @param $to 数组，[省，市]
     * @param $weight
     */
    public function __construct($from, $to, $weight = 1)
    {
        $this->from     = $from;
        $this->province = $to[0];
        if(isset($to[1])) $this->city     = $to[1];
        $this->weight   = (float) $weight;
    }

    /**
     * 获取快递运费
     * @return int|void
     */
    public function getExpressFee()
    {
        $data = $this->getInitExpressData();

        if (!$data) $data = $this->initData;

        return $this->calculate($data);
    }

    /**
     * 验证始发地是否存在,不存在则抛出异常
     * @return bool
     */
    public function checkFromIsExist()
    {
        $isExist = in_array($this->from, self::INIT_FROM_CITIES);
        if (!$isExist) {
            LogHelper::info('始发地不存在');
            return false;
        }
        return true;
    }

    /**
     * 验证始目的地参数类型是否正确
     * @return bool
     */
    public function checkTo()
    {
        if(!$this->province) {
            LogHelper::info('目的地省份不存在');
            return false;
        }
        return true;
    }

    /**
     * 根据始发地获取初始数据
     * @return array
     */
    private function getInitExpressData()
    {
        $from = $this->from;
        $initExpressData = [];

        if ($from == '北京' || $from == '北京市') {
            $initExpressData = self::FROM_BEIJING;
        } elseif ($from == '天津' || $from == '天津市') {
            $initExpressData = self::FROM_TIANJIN;
        } elseif ($from == '上海' || $from == '上海市') {
            $initExpressData = self::FROM_SHANGHAI;
        } elseif ($from == '武汉市') {
            $initExpressData = self::FROM_WUHAN;
        } elseif ($from == '长春市') {
            $initExpressData = self::FROM_CHANGCHUN;
        } elseif ($from == '郑州市') {
            $initExpressData = self::FROM_ZHENGZHOU;
        } elseif ($from == '临沂市') {
            $initExpressData = self::FROM_LINYI;
        } elseif ($from == '成都市' || $from == '资阳市' || $from == '眉山市') {
            $initExpressData = self::FROM_CHENGDU_ZIYANG_MEISHAN;
        } elseif ($from == '广州市') {
            $initExpressData = self::FROM_GUANGZHOU;
        }
        return $initExpressData;
    }

    /**
     * 获取首重单价和续重单价
     * @param $data
     * @return array
     */
    private function getUnitAndContinuedPrice($data)
    {
        $unitPrice = 0;
        $continuedPrice = 0;

        foreach ($data as $value) {
            // 确认目标
            if (in_array($this->province, $value['city'])) {

                $unitPrice      = $value['fee'];
                $continuedPrice = $value['continue'];
                // 确认是否是特殊省市
                if(isset($value['is_should_be_check_other']) && in_array($this->province, $value['is_should_be_check_other'])) {
                    foreach ($value['other'] as $otherValue) {
                        // 确认目标
                        if (in_array($this->city, $otherValue['city'])) {
                            $unitPrice      = $otherValue['fee'];
                            $continuedPrice = $otherValue['continue'];
                            break;
                        }
                    }
                }
                break;
            }
        }

        return [$unitPrice, $continuedPrice];
    }

    private function calculate($data)
    {
        // 首重单价、续重单价
        list($fee, $continued) = $this->getUnitAndContinuedPrice($data);
        // 计算规则 首重单价 + （计费重量 - 1） * 续重单价  = 结果 四舍五入取整
        // 如果不足1kg，按1kg计算
        if ($this->weight < 1) {
            $cost = $fee;
        } else {
           $cost = round($fee + ($this->weight - 1) * $continued);
        }

        return $cost;
    }
}
